"""
浅拷贝与深拷贝
    # 直接赋值：对象的引用（别名），不产生拷贝。
    # 浅拷贝：拷贝父对象，不会拷贝对象的内部的子对象。拷贝后只有第一层是独立的。
    # 深拷贝：完全拷贝了父对象及其子对象。拷贝后所有层都是独立的。
拷贝的特殊情况
    # 非容器类型（如数字、字符串、和其他“原子”类型的对象）无法拷贝
    # 元组变量如果只包含原子类型对象，则不能对其深拷贝
如何浅拷贝
    # 切片操作（如 [:]）。
    # 使用工厂函数（如 list() / set()）。
    # 使用 copy 模块的 copy() 函数。
"""
# 创建一个列表，其中包含整型和列表元素，使用 copy() 对其浅拷贝。使用 id() 查看列表地址和列表中各个元素的地址。


import copy

list1 = [1, 2, 3, [100, 200, 300]]
print(id(list1), id(list1[0]), id(list1[1]), id(list1[2]), id(list1[3]), list1)
# 4305353536 4323093080 4323093112 4323093144 4305193280 [1, 2, 3, [100, 200, 300]]

list2 = copy.copy(list1)
print(id(list2), id(list2[0]), id(list2[1]), id(list2[2]), id(list2[3]), list2)
# 4306365696 4323093080 4323093112 4323093144 4305193280 [1, 2, 3, [100, 200, 300]]

# 可以看到拷贝后新的列表地址改变了，但列表中各个元素还是同一地址。


#########################################
# 修改浅拷贝后的列表，观察对原列表的影响。
list2[0] = 111
list2[3][0] = 999
print(id(list1), id(list1[0]), id(list1[1]), id(list1[2]), id(list1[3]), list1)
# 4310612736 4330793560 4330793592 4330793624 4310452480 [1, 2, 3, [999, 200, 300]]
print(id(list2), id(list2[0]), id(list2[1]), id(list2[2]), id(list2[3]), list2)
# 4313017536 4330797080 4330793592 4330793624 4310452480 [111, 2, 3, [999, 200, 300]]

# 可以看到 list2[0] 为不可变类型元素，因此可以看到 list2[0] 指向了新的引用。
# 可以看到 list2[3] 为可变类型元素，修改不会产生新对象。

